package cl.portal.escolares.action;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.collections.ListUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cl.portal.escolares.DAO.DAOAlumno;
import cl.portal.escolares.DAO.DAOApoderado;
import cl.portal.escolares.DAO.DAOColegio;
import cl.portal.escolares.DAO.DAOCurso;
import cl.portal.escolares.DAO.DAOFormaPago;
import cl.portal.escolares.DAO.DAOFurgon;
import cl.portal.escolares.DAO.DAOPago;
import cl.portal.escolares.DAO.DAOParametro;
import cl.portal.escolares.DAO.DAOUsuario;
import cl.portal.escolares.domain.Alumno;
import cl.portal.escolares.domain.Apoderado;
import cl.portal.escolares.domain.FormaPago;
import cl.portal.escolares.domain.Pago;
import cl.portal.escolares.domain.Parametro;
import cl.portal.escolares.domain.Usuario;
import cl.portal.escolares.sheduler.ComprobantePagoPDF;
import cl.portal.escolares.sheduler.Constants;
import cl.portal.escolares.sheduler.Mail;

import com.opensymphony.xwork2.ActionSupport;

public class PagoAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private static Log _log = LogFactory.getLog(PagoAction.class);

	private Usuario usuario;
	private Long usuarioId;
	private Apoderado apoderado;
	private Long apoderadoId;
	private Alumno alumno;
	private Long alumnoId;

	private List<Pago> pagos;
	private Pago pago;
	private Long pagoId;
	private Long formaPagoId;
	private Boolean filtroFecha;
	private String fechaInicial;
	private String fechaFinal;

	private HashMap<String, Long> tiposPago;
	private Long tipoPago;

	private String nombreAlumno;
	private String apellidoAlumno;

	private HashMap<Long, String> formasPagoMap;
	private HashMap<Long, String> fechaMap;
	private HashMap<Long, String> fechaPagoMap;

	private List<FormaPago> formasPago;
	
	public String execute() throws Exception {
		try {
			SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
			if (getUsuarioId() != null && getUsuarioId() > 0)
				setUsuario(DAOUsuario.get(getUsuarioId()));
			_log.info("" + usuario.getNombres());

			fechaMap = new HashMap<Long, String>();
			fechaPagoMap = new HashMap<Long, String>();
			formasPagoMap = new HashMap<Long, String>();

			tiposPago = new HashMap<String, Long>();
			tiposPago.put("Pendiente", 1L);
			tiposPago.put("Pagado", 2L);
			tiposPago.put("Anulado", 3L);

			formasPago = DAOFormaPago.list();
			for (FormaPago fp : formasPago)
				formasPagoMap.put(fp.getFormaPagoId(), fp.getDescripcion());

			pagos = DAOPago.listMensuales(usuario.getUsuarioId());
			_log.info("pagos.size()" + pagos.size());
			for (Pago p : pagos) {
				fechaMap.put(p.getPagoId(), sd.format(p.getFecha()));
				if (null != p.getFechaPago())
					fechaPagoMap
							.put(p.getPagoId(), sd.format(p.getFechaPago()));

			}

			return "success";
		} catch (Exception e) {
			_log.error(e);
			addActionError(getText("error.login"));
			return "error";
		}
	}

	public String filter() throws Exception {
		try {
			List<Alumno>alumnos=new ArrayList<Alumno>();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
			Date fechaInicio = null;
			Date fechaFin = null;
			tiposPago = new HashMap<String, Long>();
			tiposPago.put("Pendiente", 1L);
			tiposPago.put("Pagado", 2L);
			tiposPago.put("Anulado", 3L);
			_log.info("1");
			if(null==usuario)
				usuario=DAOUsuario.get(getUsuarioId());
			_log.info("2");
			if(getNombreAlumno().length()==0)
				nombreAlumno=null;
			if(getApellidoAlumno().length()==0)
				apellidoAlumno=null;
			_log.info("3");
//			if (filtroFecha) {
			if(getFechaInicial().length()>0){
				fechaInicio = sd.parse(fechaInicial);
				fechaInicio = sdf.parse(sdf.format(fechaInicio));}
			if(getFechaFinal().length()>0){
				fechaFin = sd.parse(fechaFinal);
				fechaFin = sdf.parse(sdf.format(fechaFin));}
//			}
			_log.info("4");
			Boolean pagado=null;
			Boolean activo=null;
			
			if(tipoPago==0) tipoPago=null;
			if(tipoPago==1)	pagado=false;
			if(tipoPago==2) pagado=true;
			if(tipoPago==3) activo=true;
			
			if(null!=nombreAlumno || null!=apellidoAlumno)
				alumnos=DAOAlumno.list(usuario.getUsuarioId(), null, null, null, nombreAlumno, apellidoAlumno, null, null, true);
			else
				alumnos=new ArrayList<Alumno>();
			_log.info("alumnos.size()="+alumnos.size());
			
			_log.info("fechaInicio"+fechaInicio);
			_log.info("fechaFin"+fechaFin);
			_log.info("pagado"+pagado);
			_log.info("activo"+activo);
			
			pagos=DAOPago.listFilter(usuario.getUsuarioId(), fechaInicio, fechaFin, pagado, activo);
			_log.info("6");
			_log.info("pagos.size()="+pagos.size());
			for(Alumno al:alumnos){
				_log.info("DAOPago.list(usuario.getUsuarioId(), al.getAlumnoId(),null , null, tipoPago, null, pagado, null, activo"
			+DAOPago.list(usuario.getUsuarioId(), al.getAlumnoId(),null , null,
						 tipoPago, null, pagado, null, activo));
				ListUtils.union(pagos,DAOPago.list(usuario.getUsuarioId(), al.getAlumnoId(),null , null,
						 tipoPago, null, pagado, null, activo));
				  
			}
			 for (Pago p : pagos) {
					fechaMap.put(p.getPagoId(), sd.format(p.getFecha()));
					if(null!=p.getFechaPago())
						fechaPagoMap.put(p.getPagoId(), sd.format(p.getFechaPago()));
					
				}
			_log.info("pagos.size()"+pagos.size());
			return "success";
		} catch (Exception e) {
			_log.error(e);
			addActionError(getText("error.login"));
			return "error";
		}
	}
	public String saveFromFilter() throws Exception {
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
		formasPago = DAOFormaPago.list();
		formasPagoMap = new HashMap<Long, String>();
		fechaPagoMap = new HashMap<Long, String>();
		fechaMap = new HashMap<Long, String>();
		tiposPago = new HashMap<String, Long>();
		tiposPago.put("Pendiente", 1L);
		tiposPago.put("Pagado", 2L);
		tiposPago.put("Anulado", 3L);
		try {
			for (FormaPago fp : formasPago)
				formasPagoMap.put(fp.getFormaPagoId(), fp.getDescripcion());
			_log.info("pago.pagoId"+getPagoId());
			if(null==getPagoId())return ERROR;
			pago=DAOPago.get(getPagoId());
			if (getUsuarioId() != null && getUsuarioId() > 0)
				setUsuario(DAOUsuario.get(getUsuarioId()));
			else
				setUsuario(DAOUsuario.get(pago.getUsuarioId()));
			pago.setPagado(true);
			pago.setFormaPagoId(getFormaPagoId());
			pago.setFechaPago(new Date());
			DAOPago.update(pago);

			setPagos(DAOPago.listMensuales(usuario.getUsuarioId()));
			for (Pago p : pagos) {
				fechaMap.put(p.getPagoId(), sd.format(p.getFecha()));
				if (null != p.getFechaPago())
					fechaPagoMap
							.put(p.getPagoId(), sd.format(p.getFechaPago()));

			}
			setApoderado(DAOApoderado.get(pago.getApoderadoId()));
			setAlumno(DAOAlumno.get(pago.getAlumnoId()));
			ComprobantePagoPDF.generar(usuario, pago, apoderado, alumno);

			String emailToApoderado = apoderado.getEmail();
			Parametro para = DAOParametro.get(usuario.getUsuarioId(),
					"mailComprobante");

			String bodyMessage = para.getValor1() + " " + pago.getMonto() + " "
					+ para.getValor2() + " " + usuario.getNombreEmpresa()+""+para.getValor3();

			Mail mailToApoderado = new Mail("logvan.cl@gmail.com",
					"logvanadministracion", emailToApoderado,
					para.getValor4()+" "
							+ usuario.getNombreEmpresa(), "Estimado(a) "
							+ apoderado.getNombres() + " "
							+ apoderado.getApellidos() + "<br>" + bodyMessage,
					"1", pago.getRutaPDF());
			;
			_log.info("send" + mailToApoderado.send());

			
			return "success";
		} catch (Exception e) {
			_log.error(e);
			addActionError(getText("error.login"));
			return "error";
		}
	}

	public Pago getPago() {
		return pago;
	}

	public void setPago(Pago pago) {
		this.pago = pago;
	}

	public static Log get_log() {
		return _log;
	}

	public static void set_log(Log _log) {
		PagoAction._log = _log;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Long getUsuarioId() {
		return usuarioId;
	}

	public void setUsuarioId(Long usuarioId) {
		this.usuarioId = usuarioId;
	}

	public Apoderado getApoderado() {
		return apoderado;
	}

	public void setApoderado(Apoderado apoderado) {
		this.apoderado = apoderado;
	}

	public Long getApoderadoId() {
		return apoderadoId;
	}

	public void setApoderadoId(Long apoderadoId) {
		this.apoderadoId = apoderadoId;
	}

	public Alumno getAlumno() {
		return alumno;
	}

	public void setAlumno(Alumno alumno) {
		this.alumno = alumno;
	}

	public Long getAlumnoId() {
		return alumnoId;
	}

	public void setAlumnoId(Long alumnoId) {
		this.alumnoId = alumnoId;
	}

	public List<Pago> getPagos() {
		return pagos;
	}

	public void setPagos(List<Pago> pagos) {
		this.pagos = pagos;
	}

	public String getFechaInicial() {
		return fechaInicial;
	}

	public void setFechaInicial(String fechaInicial) {
		this.fechaInicial = fechaInicial;
	}

	public String getFechaFinal() {
		return fechaFinal;
	}

	public void setFechaFinal(String fechaFinal) {
		this.fechaFinal = fechaFinal;
	}

	public String getNombreAlumno() {
		return nombreAlumno;
	}

	public void setNombreAlumno(String nombreAlumno) {
		this.nombreAlumno = nombreAlumno;
	}

	public String getApellidoAlumno() {
		return apellidoAlumno;
	}

	public void setApellidoAlumno(String apellidoAlumno) {
		this.apellidoAlumno = apellidoAlumno;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Boolean getFiltroFecha() {
		return filtroFecha;
	}

	public void setFiltroFecha(Boolean filtroFecha) {
		this.filtroFecha = filtroFecha;
	}

	public HashMap<String, Long> getTiposPago() {
		return tiposPago;
	}

	public void setTiposPago(HashMap<String, Long> tiposPago) {
		this.tiposPago = tiposPago;
	}

	public Long getTipoPago() {
		return tipoPago;
	}

	public void setTipoPago(Long tipoPago) {
		this.tipoPago = tipoPago;
	}

	public HashMap<Long, String> getFormasPagoMap() {
		return formasPagoMap;
	}

	public void setFormasPagoMap(HashMap<Long, String> formasPagoMap) {
		this.formasPagoMap = formasPagoMap;
	}

	public HashMap<Long, String> getFechaMap() {
		return fechaMap;
	}

	public void setFechaMap(HashMap<Long, String> fechaMap) {
		this.fechaMap = fechaMap;
	}

	public HashMap<Long, String> getFechaPagoMap() {
		return fechaPagoMap;
	}

	public void setFechaPagoMap(HashMap<Long, String> fechaPagoMap) {
		this.fechaPagoMap = fechaPagoMap;
	}

	public List<FormaPago> getFormasPago() {
		return formasPago;
	}

	public void setFormasPago(List<FormaPago> formasPago) {
		this.formasPago = formasPago;
	}

	public Long getPagoId() {
		return pagoId;
	}

	public void setPagoId(Long pagoId) {
		this.pagoId = pagoId;
	}

	public Long getFormaPagoId() {
		return formaPagoId;
	}

	public void setFormaPagoId(Long formaPagoId) {
		this.formaPagoId = formaPagoId;
	}

}
